package main

import "fmt"

func main() {
	// 创建一个长度为3，容量为4的切片。
	s1 := make([]int, 3, 4)
	//为切片s1增加一个新的元素，因为没有超过最大容量，因此不会分配新的底层数组
	fmt.Printf("%+v,%d,%d,%p,%p\n", s1, len(s1), cap(s1), s1, &s1[0])
	//[0 0 0],3,4,0xc0000be000,0xc0000be000
	s2 := append(s1, 1) //为s1增加一个元素，appen函数将新生成的切片返回给s2
	fmt.Printf("%+v,len=%d,cap=%d,SliceHeader:%p,array:%p\n", s2, len(s2), cap(s2), &s2, &s2[0])
	//[0 0 0],4,4,0xc0000a8048,0xc0000be000

	//s1修改一个元素，实际上是修改底层数组数据，s1和s2公用底层数组，s2数值也会变化
	fmt.Println("~~~~~~~~~~~~~~~~~")
	s1[0] = 100
	fmt.Printf("%+v,len=%d,cap=%d,SliceHeader:%p,array:%p\n", s1, len(s1), cap(s1), &s1, &s1[0]) //打印s1切片内容
	fmt.Printf("%+v,len=%d,cap=%d,SliceHeader:%p,array:%p\n", s2, len(s2), cap(s2), &s2, &s2[0]) //打印s2切片内容
	//s2修改一个元素，实际上是修改底层公用数组，s2修改数据修改底层数组
	s2[1] = 200
	fmt.Printf("%+v,len=%d,cap=%d,SliceHeader:%p,array:%p\n", s1, len(s1), cap(s1), &s1, &s1[0]) //打印s1切片内容
	fmt.Printf("%+v,len=%d,cap=%d,SliceHeader:%p,array:%p\n", s2, len(s2), cap(s2), &s2, &s2[0]) //打印s2切片内容

	//为s2再增加一个元素，因为s2的长度和容量都为4，再增加一个元素底层数组将重新分配。
	fmt.Println("~~~~~~~~~~~~~~~~~")
	s2 = append(s2, 2)
	fmt.Printf("%+v,len=%d,cap=%d,SliceHeader:%p,array:%p\n", s1, len(s1), cap(s1), &s1, &s1[0]) //打印s1切片内容
	fmt.Printf("%+v,len=%d,cap=%d,SliceHeader:%p,array:%p\n", s2, len(s2), cap(s2), &s2, &s2[0]) //打印s2切片内容

}

// 批改意见
// s2修改最后一个元素对s1无影响，因为s1的长度比s2要短